import { ElMessageBox } from 'element-plus'
import type { Action, ElMessageBoxOptions } from 'element-plus'

/**
 * 确认对话框工具类
 */
export class ConfirmDialog {
  /**
   * 显示确认对话框
   * @param message 确认消息
   * @param title 对话框标题，默认为"确认"
   * @param options 额外选项
   * @returns Promise<Action>
   */
  static async confirm(
    message: string,
    title: string = '确认',
    options?: Partial<ElMessageBoxOptions>
  ): Promise<Action> {
    const defaultOptions: ElMessageBoxOptions = {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
      showCancelButton: true,
      showClose: true,
      closeOnClickModal: false,
      closeOnPressEscape: true,
      ...options
    }

    return await ElMessageBox.confirm(message, title, defaultOptions)
  }

  /**
   * 显示删除确认对话框
   * @param itemName 要删除的项目名称
   * @param itemType 项目类型，默认为"项目"
   * @returns Promise<Action>
   */
  static async confirmDelete(
    itemName?: string,
    itemType: string = '项目'
  ): Promise<Action> {
    const message = itemName 
      ? `确定要删除${itemType}"${itemName}"吗？`
      : `确定要删除这个${itemType}吗？`
    
    return await this.confirm(
      message,
      '确认删除',
      {
        confirmButtonText: '删除',
        cancelButtonText: '取消',
        type: 'warning',
        confirmButtonClass: 'el-button--danger'
      }
    )
  }

  /**
   * 显示保存确认对话框
   * @param message 确认消息，默认为"确定要保存吗？"
   * @returns Promise<Action>
   */
  static async confirmSave(message: string = '确定要保存吗？'): Promise<Action> {
    return await this.confirm(
      message,
      '确认保存',
      {
        confirmButtonText: '保存',
        cancelButtonText: '取消',
        type: 'info'
      }
    )
  }

  /**
   * 显示退出确认对话框
   * @param message 确认消息，默认为"确定要退出吗？"
   * @returns Promise<Action>
   */
  static async confirmExit(message: string = '确定要退出吗？'): Promise<Action> {
    return await this.confirm(
      message,
      '确认退出',
      {
        confirmButtonText: '退出',
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
  }

  /**
   * 显示重置确认对话框
   * @param message 确认消息，默认为"确定要重置吗？此操作不可撤销。"
   * @returns Promise<Action>
   */
  static async confirmReset(message: string = '确定要重置吗？此操作不可撤销。'): Promise<Action> {
    return await this.confirm(
      message,
      '确认重置',
      {
        confirmButtonText: '重置',
        cancelButtonText: '取消',
        type: 'warning',
        confirmButtonClass: 'el-button--danger'
      }
    )
  }

  /**
   * 显示批量操作确认对话框
   * @param action 操作类型
   * @param count 操作数量
   * @param itemType 项目类型，默认为"项目"
   * @returns Promise<Action>
   */
  static async confirmBatchAction(
    action: string,
    count: number,
    itemType: string = '项目'
  ): Promise<Action> {
    const message = `确定要${action}选中的${count}个${itemType}吗？`
    
    return await this.confirm(
      message,
      `确认${action}`,
      {
        confirmButtonText: action,
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
  }

  /**
   * 显示自定义确认对话框
   * @param options 完整的MessageBox选项
   * @returns Promise<Action>
   */
  static async custom(options: ElMessageBoxOptions): Promise<Action> {
    return await ElMessageBox.confirm(options.message, options.title || '确认', options)
  }
}

/**
 * 便捷的确认对话框函数
 */
export const confirm = {
  /**
   * 基础确认对话框
   */
  async confirm(message: string, title?: string, options?: Partial<ElMessageBoxOptions>) {
    return await ConfirmDialog.confirm(message, title, options)
  },

  /**
   * 删除确认
   */
  async delete(itemName?: string, itemType?: string) {
    return await ConfirmDialog.confirmDelete(itemName, itemType)
  },

  /**
   * 保存确认
   */
  async save(message?: string) {
    return await ConfirmDialog.confirmSave(message)
  },

  /**
   * 退出确认
   */
  async exit(message?: string) {
    return await ConfirmDialog.confirmExit(message)
  },

  /**
   * 重置确认
   */
  async reset(message?: string) {
    return await ConfirmDialog.confirmReset(message)
  },

  /**
   * 批量操作确认
   */
  async batch(action: string, count: number, itemType?: string) {
    return await ConfirmDialog.confirmBatchAction(action, count, itemType)
  },

  /**
   * 自定义确认
   */
  async custom(options: ElMessageBoxOptions) {
    return await ConfirmDialog.custom(options)
  }
}

/**
 * 默认导出确认工具类
 */
export default ConfirmDialog
